package Harmonisation;

import java.io.File;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.Iterator;

import javax.sound.midi.MidiSystem;
import javax.sound.midi.Sequence;

import Harmonisation.Voix.Alto;
import Harmonisation.Voix.Basse;
import Harmonisation.Voix.Soprano;
import Harmonisation.Voix.Tenor;

public class Chant {
	private Basse basse;
	private Tenor tenor;
	private Alto alto;
	private Soprano soprano;

	
	public Chant(ArrayList<Note> basse, ArrayList<Note> tenor, ArrayList<Note> alto, ArrayList<Note> soprano) {
		this.basse = new Basse(basse);
		this.tenor = new Tenor(tenor);
		this.alto = new Alto(alto);
		this.soprano = new Soprano(soprano);
	}

	public Chant(ArrayList<EnsembleNote> ensembleNoteArray, ArrayList<Note> soprano) {
		/*
		 * ce constructeur prend une liste d'ensemble de note, et cree un chant avec un temps de 1 pour les autres instrument que le soprano,
		 * garde la voix soprano tel que décrite dans le passage en argument
		 */
		Iterator<EnsembleNote> it = ensembleNoteArray.iterator();
		ArrayList<Note> bassePartition = new ArrayList<Note>();
		ArrayList<Note> tenorPartition = new ArrayList<Note>();
		ArrayList<Note> altoPartition = new ArrayList<Note>();
		while (it.hasNext()) {
			EnsembleNote ensembleNote = it.next();

			bassePartition.add(ensembleNote.getBasse());
			tenorPartition.add(ensembleNote.getTenor());
			altoPartition.add(ensembleNote.getAlto());
		}
		this.basse = new Basse(bassePartition);
		this.tenor = new Tenor(tenorPartition);
		this.alto = new Alto(altoPartition);
		this.soprano = new Soprano(soprano);
	}

	
	public void ajoutBasse(String note, int temps) {
		getBasse().ajouterNote(note, temps);
	}

	public void ajoutTenor(String note, int temps) {
		getTenor().ajouterNote(note, temps);
	}

	public void ajoutAlto(String note, int temps) {
		getAlto().ajouterNote(note, temps);
	}

	public void ajoutSoprano(String note, int temps) {
		getSoprano().ajouterNote(note, temps);
	}

	/**
	 * Permet de créer le midi du chant
	 * 
	 * @param nomFichier
	 *            Nom du fichier au format .mid
	 */
	public void sortieMidi(String nomFichier) {
		try {
			File outputFile = new File(nomFichier);
			Sequence sequence = new Sequence(Sequence.PPQ, 1, 4);
			getBasse().trackMidi(sequence, 32);
			getTenor().trackMidi(sequence, 25);
			getAlto().trackMidi(sequence, 79);
			getSoprano().trackMidi(sequence, 0);
			MidiSystem.write(sequence, 1, outputFile);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * Permet de créer le lilypond du chant
	 * 
	 * @param nomFichier
	 *            Nom du fichier au format .ly
	 */
	public void sortieLilypond(String nomFichier) {
		String s = "\\header{\n";
		s += "title = \"" + nomFichier + "\"\n";
		s += "}\n\n";
		s += "\\new ChoirStaff\n";
		s += "<<\n";
		s += getSoprano().lilypond();
		s += getAlto().lilypond();
		s += getTenor().lilypond();
		s += getBasse().lilypond();
		s += ">>\n\n";
		s += "\\version \"2.18.2\"";
		try {
			FileWriter w;
			w = new FileWriter(nomFichier);
			w.write(s);
			w.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public String toString() {
		String s = "";
		s += this.getBasse();
		s += "\n";
		s += this.getTenor();
		s += "\n";
		s += this.getAlto();
		s += "\n";
		s += this.getSoprano();
		s += "\n";
		return s;
	}

	public Soprano getSoprano() {
		return soprano;
	}

	public void setSoprano(Soprano soprano) {
		this.soprano = soprano;
	}

	public Alto getAlto() {
		return alto;
	}

	public void setAlto(Alto alto) {
		this.alto = alto;
	}

	public Tenor getTenor() {
		return tenor;
	}

	public void setTenor(Tenor tenor) {
		this.tenor = tenor;
	}

	public Basse getBasse() {
		return basse;
	}

	public void setBasse(Basse basse) {
		this.basse = basse;
	}
}
